package cn.good.yan;

import cn.good.yan.entity.COrder;
import cn.good.yan.entity.User;
import cn.good.yan.mapper.COrderMapper;
import cn.good.yan.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.math.BigDecimal;

/**
 * 水平分片 - 水平分库 的测试
 * 引用：application3.properties 配置文件
 * 准备：server-order1 数据源中有2个表（t_order0 和 t_order1）和 server-order2数据源中有2个表（t_order0 和 t_order1）
 *
 * @author shengren.yan
 * @create 2024/12/8
 */
@SpringBootTest
public class SplitTest3 {


    @Autowired
    private UserMapper userMapper;

    @Autowired
    private COrderMapper cOrderMapper;


    /**
     * 水平分片 - 写入数据的测试
     * 有2个数据库 （order1库 order2库）
     * 写操作，分别插入对应的数据库的sql
     * 会打印2条SQL 语句：Logic SQL（逻辑SQL） - Actual SQL（具体操作的库）
     */
    @Test
    public void testInsert() {

        // 绑定是server-user 数据源
        User user = new User();
        user.setUname("李娜");
        userMapper.insert(user);


        // 1. 测试 - server-order1的数据源是否ok   （只开启该配置）
        // 逻辑SQL（Logic SQL） ：插入 t_c_order表
        // 实际SQL（Actual SQ） ：插入 server-order1 数据源 t_order1 表
        COrder order = new COrder();
        order.setOrderNo("订单1");
        order.setUserId(user.getId());
        order.setAmount(new BigDecimal(2));
        cOrderMapper.insert(order);

        // 2. 测试 server-order2的数据源是否ok   （只开启该配置），执行运行该方法
        // 逻辑SQL（Logic SQL） ：插入 t_c_order表
        // 实际SQL（Actual SQ） ：插入 server-order2 数据源 t_order1 表

    }


    /**
     * 测试 - 水平分库 (分库插入数据)
     * 取模分片算法 和  取模分片算法 -- 一起用该方法
     * 分片规则：表中`user_id`为偶数时，数据插入`server-order1数据源`，`user_id`为奇数时，数据插入`server-order2数据源`
     */
    @Test
    public void test1() {
        for (long i = 1; i < 8; i++) {
            COrder order = new COrder();
            order.setOrderNo("订单" + i);
            order.setUserId(i);
            order.setAmount(new BigDecimal(100));
            cOrderMapper.insert(order);
            // 分片规则：（取模分片算法）
            // 实现：user_id：为偶数，插入到 server-order1
            // 实现：user_id：为基数，插入到 server-order2
        }
    }


}
